home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
parallax
/
more_exa.tar
/
more
/
gauss.p
< prev
next >
Wrap
Text File
|
1993-06-15
|
3KB
|
94 lines
SYSTEM gauss_jordan;
CONST n = 5;
TYPE matrix = ARRAY [1..n],[1..n+1] OF REAL;
line = ARRAY [1..n] OF REAL;
CONFIGURATION grid [1..n],[1..n+1];
CONNECTION up: grid[i,j] <-> grid[(i-1), j] .down;
row: grid[i,j] -> grid[i, 1..n+1].row;
col: grid[i,j] -> grid[1..n, j].col;
SCALAR a : matrix;
a_l, b_l: line;
VECTOR vmat : REAL;
PROCEDURE input (SCALAR VAR a : matrix);
(* reading input for A and b from terminal *)
SCALAR i,j : INTEGER;
BEGIN
WriteString("Enter value of matrix A and vector b line by line :");
WriteLn;
FOR i := 1 TO n DO
FOR j := 1 TO n+1 DO ReadReal(a[i,j]) END;
END;
END input;
PROCEDURE output (SCALAR VAR a,b: line);
(* print results on terminal *)
SCALAR i: INTEGER;
BEGIN
WriteString("Solution:"); WriteLn;
FOR i := 1 TO n DO
IF a[i] = 0.0 THEN
IF b[i] = 0.0 THEN WriteString("equation system linear dependent");
ELSE WriteString("equation system insoluble");
END;
ELSE WriteFixPt(b[i]/a[i],9,2);
END;
WriteLn;
END;
END output;
PROCEDURE elimination (SCALAR smat: matrix; SCALAR VAR a,b: line);
SCALAR i,num,diag : INTEGER;
diag_el, el : REAL;
ok : BOOLEAN;
VECTOR mat, sub, change1, change2,
first_el, top_el : REAL;
BEGIN
LOAD(mat,smat);
FOR diag := 1 TO n DO
STORE[diag],[diag] (mat,diag_el);
IF (diag_el = 0.0) AND (diag<n) THEN (* change lines *)
i := diag;
REPEAT
INC(i);
STORE[i],[diag] (mat,el);
ok := el <> 0.0;
UNTIL (i=n) OR ok;
IF ok THEN
num := i-diag;
PARALLEL
PROPAGATE.down^num (mat, change1);
PROPAGATE.up^num (mat, change2);
IF DIM1 = i THEN mat := change1 END;
IF DIM1 = diag THEN mat := change2 END;
ENDPARALLEL
END;
END; (* diag_el = 0.0 *)
PARALLEL
IF DIM2 = diag THEN
SEND grid.row(mat) TO grid.row(first_el)
END;
IF first_el <> 0.0 THEN mat := mat / first_el END;
IF DIM1 = diag THEN
SEND grid.col(mat) TO grid.col(top_el)
END;
IF (DIM1 <> diag) AND (first_el <> 0.0) THEN mat := mat - top_el END;
ENDPARALLEL;
END; (* for diag *)
STORE [DIM1],[DIM1] (mat,a);
STORE [*], [n+1] (mat,b);
END elimination;
BEGIN (* main program *)
input(a);
elimination(a, a_l,b_l);
output(a_l,b_l);
END gauss_jordan.